home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / main.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  39KB  |  1,218 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   main.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   28-Sep-91
  7. *   Current version :   1.0
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   28-Sep-91     1.0             main routine
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data.
  23.  */
  24. extern struct Window        *MainWindow;
  25. extern struct Screen        *MainScreen;
  26. extern struct RastPort      *MainRP;
  27. extern struct Process       *MainProc;
  28. extern struct Menu          *MainMenus;
  29. extern struct WBStartup     *_WBMsg;
  30. extern struct MemoryChain   *Chain, *Misc;
  31. extern ULONG                 Class;
  32. extern UWORD                 Code;
  33. extern UBYTE                 MainFileName[512], MainWBStatus[20];
  34. extern APTR                  MainVisualInfo;
  35. extern UBYTE                *MainExtension;
  36. extern struct TextAttr       Topaz80;
  37. extern struct TagItem        MainSTags[];
  38. extern UWORD                 sc_Height;
  39. extern BOOL                  WBenchClose;
  40. extern struct ExtGadgetList  Gadgets;
  41. extern struct Gadget        *MainGList;
  42. extern UWORD                 ActiveKind;
  43. extern struct TagItem        nwTags[];
  44. extern BOOL                  BreakDRAG;
  45. extern struct Prefs          MainPrefs;
  46. extern UBYTE                 MainWindowTitle[80], MainScreenTitle[80];
  47. extern BOOL                  Saved;
  48. extern ULONG                 Args[];
  49. extern struct RDArgs         IArgs, *FArgs;
  50. extern UBYTE                *Template;
  51. extern struct WBStartup     *_WBMsg;
  52. extern WORD                  ws_IWidth, ws_IHeight;
  53. extern UBYTE                 bi_SPath[], bi_LPath[];
  54. extern UBYTE                 bi_SFile[], bi_LFile[];
  55. extern struct ExtMenuList    ExtMenus;
  56.  
  57. /*
  58.  * --- The main menu strip.
  59.  */
  60. struct NewMenu           Menus[] = {
  61.     /*** the Project menu ***/
  62.     NM_TITLE,   "Project",              0,  0,  0,  0,
  63.     NM_ITEM,    "About",                "?",0,  0,  0,
  64.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  65.     NM_ITEM,    "New",                  "N",0,  0,  0,
  66.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  67.     NM_ITEM,    "Load",                 "L",0,  0,  0,
  68.     NM_ITEM,    "Save",                 "S",0,  0,  0,
  69.     NM_ITEM,    "Save As..",            "V",0,  0,  0,
  70.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  71.     NM_ITEM,    "Generate Source",      0,  0,  0,  0,
  72.     NM_SUB,     "C",                    "C",0,  0,  0,
  73.     NM_SUB,     "Assembler",            "A",0,  0,  0,
  74.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  75.     NM_ITEM,    "Preferences",          "P",0,  0,  0,
  76.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  77.     NM_ITEM,    MainWBStatus,           "W",0,  0,  0,
  78.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  79.     NM_ITEM,    "Quit",                 "Q",0,  0,  0,
  80.  
  81.     /*** the Gadgets menu ***/
  82.     NM_TITLE,   "Gadgets",              0,  0,  0,  0,
  83.     NM_ITEM,    "Kind",                 0,  0,  0,  0,
  84.     NM_SUB,     "BUTTON",               "1", CHECKIT + CHECKED, ~1,  0,
  85.     NM_SUB,     "CHECKBOX",             "2", CHECKIT,           ~2,  0,
  86.     NM_SUB,     "INTEGER",              "3", CHECKIT,           ~4,  0,
  87.     NM_SUB,     "LISTVIEW",             "4", CHECKIT,           ~8,  0,
  88.     NM_SUB,     "MX",                   "5", CHECKIT,           ~16, 0,
  89.     NM_SUB,     "CYCLE",                "6", CHECKIT,           ~32, 0,
  90.     NM_SUB,     "PALETTE",              "7", CHECKIT,           ~64, 0,
  91.     NM_SUB,     "SCROLLER",             "8", CHECKIT,           ~128,0,
  92.     NM_SUB,     "SLIDER",               "9", CHECKIT,           ~256,0,
  93.     NM_SUB,     "STRING",               "0", CHECKIT,           ~512,0,
  94.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  95.     NM_ITEM,    "Move   a gadget",      "M",0,  0,  0,
  96.     NM_ITEM,    "Size   a gadget",      "Z",0,  0,  0,
  97.     NM_ITEM,    "Copy   a gadget",      "O",0,  0,  0,
  98.     NM_ITEM,    "Delete a gadget",      "D",0,  0,  0,
  99.     NM_ITEM,    "Edit   a gadget",      "E",0,  0,  0,
  100.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  101.     NM_ITEM,    "Join",                 "J",0,  0,  0,
  102.     NM_ITEM,    "Split",                "Y",0,  0,  0,
  103.  
  104.     /*** the Window menu ***/
  105.     NM_TITLE,   "Window",               0,  0,  0,  0,
  106.     NM_ITEM,    "Edit Flags",           "F",0,  0,  0,
  107.     NM_ITEM,    "Edit IDCMP",           "I",0,  0,  0,
  108.     NM_ITEM,    "Edit Tags",            "T",0,  0,  0,
  109.     NM_ITEM,    NM_BARLABEL,            0,  0,  0,  0,
  110.     NM_ITEM,    "Add    a text",        "X",0,  0,  0,
  111.     NM_ITEM,    "Modify a text",        "Y",0,  0,  0,
  112.     NM_ITEM,    "Delete a text",        "K",0,  0,  0,
  113.     NM_ITEM,    "Move   a text",        "H",0,  0,  0,
  114.  
  115.     /*** the Screen menu ***/
  116.     NM_TITLE,   "Screen",               0,  0,  0,  0,
  117.     NM_ITEM,    "Palette",              "T",0,  0,  0,
  118.     NM_ITEM,    "Get Font",             "G",0,  0,  0,
  119.     NM_ITEM,    "Set DriPens",          "R",0,  0,  0,
  120.     NM_ITEM,    "Edit Tags",            "G",0,  0,  0,
  121.  
  122.     /*** the Menu menu ***/
  123.     NM_TITLE,   "Menus",                0,  0,  0,  0,
  124.     NM_ITEM,    "Edit Menus",           "<",0,  0,  0,
  125.     NM_ITEM,    "Test Menus",           ">",0,  0,  0,
  126.  
  127.     NM_END };
  128.  
  129. /*
  130.  * --- Handle all menu events. This routine also
  131.  * --- handles drag selections.
  132.  */
  133. void HandleMenus( void )
  134. {
  135.     struct IntuiText *t;
  136.     struct MenuItem  *Next;
  137.     UWORD             menu, item, sub, sel = Code;
  138.  
  139.     while  ( sel != MENUNULL ) {
  140.  
  141.         menu = MENUNUM( sel );
  142.         item = ITEMNUM( sel );
  143.         sub  = SUBNUM( sel );
  144.  
  145.         switch ( menu ) {
  146.  
  147.             case    0:
  148.                 switch ( item ) {
  149.  
  150.                     case    0: /*** About ***/
  151.                         About();
  152.                         break;
  153.                     case    2: /*** New ***/
  154.                         New();
  155.                         break;
  156.                     case    4: /*** Load ***/
  157.                         ReadBinary( TRUE );
  158.                         break;
  159.                     case    5: /*** Save ***/
  160.                         WriteBinary( FALSE );
  161.                         break;
  162.                     case    6: /*** Save As ***/
  163.                         WriteBinary( TRUE );
  164.                         break;
  165.                     case    8: /*** Generate Source ***/
  166.                         switch ( sub ) {
  167.  
  168.                             case    0: /*** C ***/
  169.                                 WriteCSource();
  170.                                 break;
  171.                             case    1: /*** Assembler ***/
  172.                                 WriteAsmSource();
  173.                                 break;
  174.                         }
  175.                         break;
  176.                     case    10: /*** Preferences ***/
  177.                         Preferences();
  178.                         break;
  179.                     case    12: /*** Workbench ***/
  180.                         DoWBench();
  181.                         break;
  182.                     case    14: /*** Quit ***/
  183.                         Quit();
  184.                         break;
  185.                         break;
  186.                 }
  187.                 break;
  188.  
  189.             case    1:
  190.                 switch ( item ) {
  191.  
  192.                     case    0:
  193.                         switch ( sub ) {
  194.  
  195.                             case    0: /*** BUTTON ***/
  196.                                 ActiveKind = BUTTON_KIND;
  197.                                 break;
  198.                             case    1: /*** CHECKBOX ***/
  199.                                 ActiveKind = CHECKBOX_KIND;
  200.                                 break;
  201.                             case    2: /*** INTEGER ***/
  202.                                 ActiveKind = INTEGER_KIND;
  203.                                 break;
  204.                             case    3: /*** LISTVIEW ***/
  205.                                 ActiveKind = LISTVIEW_KIND;
  206.                                 break;
  207.                             case    4: /*** MX ***/
  208.                                 ActiveKind = MX_KIND;
  209.                                 break;
  210.                             case    5: /*** CYCLE ***/
  211.                                 ActiveKind = CYCLE_KIND;
  212.                                 break;
  213.                             case    6: /*** PALETTE ***/
  214.                                 ActiveKind = PALETTE_KIND;
  215.                                 break;
  216.                             case    7: /*** SCROLLER ***/
  217.                                 ActiveKind = SCROLLER_KIND;
  218.                                 break;
  219.                             case    8: /*** SLIDER ***/
  220.                                 ActiveKind = SLIDER_KIND;
  221.                                 break;
  222.                             case    9: /*** STRING ***/
  223.                                 ActiveKind = STRING_KIND;
  224.                                 break;
  225.                         }
  226.                         break;
  227.  
  228.                     case    2: /*** Move ***/
  229.                         MoveGadget();
  230.                         break;
  231.                     case    3: /*** Size ***/
  232.                         SizeGadget();
  233.                         break;
  234.                     case    4: /*** Copy ***/
  235.                         CopyGadget();
  236.                         break;
  237.                     case    5: /*** Delete ***/
  238.                         DeleteGadget();
  239.                         break;
  240.                     case    6: /*** Edit ***/
  241.                         EditGadget();
  242.                         break;
  243.                     case    8: /*** Join ***/
  244.                         Join();
  245.                         break;
  246.                     case    9: /*** Split ***/
  247.                         Split();
  248.                         break;
  249.                 }
  250.                 break;
  251.  
  252.             case    2:
  253.                 switch ( item ) {
  254.  
  255.                     case    0: /*** Window Flags ***/
  256.                         EditFlags();
  257.                         break;
  258.                     case    1: /*** Window IDCMP ***/
  259.                         EditIDCMP();
  260.                         break;
  261.                     case    2: /*** Window Tags ***/
  262.                         WindowSpecial();
  263.                         break;
  264.                     case    4: /*** Add text ***/
  265.                         PlaceText( EditText( 0l ));
  266.                         RefreshWindow();
  267.                         break;
  268.                     case    5: /*** Modify text ***/
  269.                         t = SelectText();
  270.                         if ( t ) EditText( t );
  271.                         ClearWindow();
  272.                         RefreshWindow();
  273.                         break;
  274.                     case    6: /*** Delete text ***/
  275.                         RemoveText( SelectText());
  276.                         ClearWindow();
  277.                         RefreshWindow();
  278.                         break;
  279.                     case    7: /*** Move text ***/
  280.                         PlaceText( SelectText());
  281.                         ClearWindow();
  282.                         RefreshWindow();
  283.                         break;
  284.                 }
  285.                 break;
  286.  
  287.             case    3:
  288.                 switch ( item ) {
  289.  
  290.                     case    0: /*** Screen Palette ***/
  291.                         SetPalette();
  292.                         break;
  293.  
  294.                     case    1: /*** Get Font ***/
  295.                         GetFont();
  296.                         break;
  297.  
  298.                     case    2: /*** Edit screen dripens ***/
  299.                         EditDriPens();
  300.                         break;
  301.  
  302.                     case    3: /*** Edit Screen tags ***/
  303.                         ScreenSpecial();
  304.                         break;
  305.                 }
  306.                 break;
  307.  
  308.             case    4:
  309.                 switch ( item ) {
  310.  
  311.                     case    0: /*** Edit Menus ***/
  312.                         MenuEdit();
  313.                         break;
  314.                     case    1: /*** Test Menus ***/
  315.                         TestMenus();
  316.                         break;
  317.                 }
  318.                 break;
  319.         }
  320.  
  321.         if ( BreakDRAG ) {
  322.             BreakDRAG = FALSE;
  323.             break;
  324.         } else {
  325.             Next = ItemAddress(  MainMenus, sel );
  326.             sel = Next->NextSelect;
  327.         }
  328.     }
  329. }
  330.  
  331. /*
  332.  * --- Allocate and open all resources.
  333.  */
  334. void SetupProgram( long dsp )
  335. {
  336.     BPTR    file;
  337.  
  338.     if ( NOT OpenLibraries())
  339.         QuitProgram( 20l );
  340.  
  341.     if ( NOT( Chain = GetMemoryChain( 4096l )))
  342.         QuitProgram( 21l );
  343.     if ( NOT( Misc = GetMemoryChain( 4096l )))
  344.         QuitProgram( 21l );
  345.  
  346.     NewList(( struct List * )&Gadgets );
  347.     NewList(( struct List * )&ExtMenus );
  348.  
  349.     if ( NOT ModeNotAvailable( PAL_MONITOR_ID )) {
  350.         MainSTags[3].ti_Data = 256;
  351.         sc_Height            = 256;
  352.     } else {
  353.         MainSTags[3].ti_Data = 200;
  354.         sc_Height            = 200;
  355.     }
  356.  
  357.     if ( file = Open( "DEVS:GadToolsBox.PREFS", MODE_OLDFILE )) {
  358.         Read( file, (char *)&MainPrefs, (long)sizeof( struct Prefs ));
  359.         Close( file );
  360.     }
  361.  
  362.     if ( NOT dsp ) {
  363.         if ( NOT ScreenSelect())
  364.             QuitProgram( 0l );
  365.  
  366.         if( NOT ReOpenScreen( TRUE ))
  367.             QuitProgram( 22l );
  368.     }
  369. }
  370.  
  371. /*
  372.  * --- Deallocate and close all resources.
  373.  */
  374. void QuitProgram( long code )
  375. {
  376.     if ( WBenchClose )
  377.         DoWBench();
  378.  
  379.     DeleteTexts();
  380.     FreeNewMenus();
  381.  
  382.     if ( MainMenus ) {
  383.         if ( MainWindow )   ClearMenuStrip( MainWindow );
  384.         FreeMenus( MainMenus );
  385.     }
  386.     if ( MainWindow )
  387.         CloseWindow( MainWindow );
  388.     if ( MainGList )
  389.         FreeGadgets( MainGList );
  390.  
  391.     FreeScreenInfo( MainScreen );
  392.  
  393.     if ( MainScreen )
  394.         CloseScreen( MainScreen );
  395.  
  396.     if ( Chain )
  397.         FreeMemoryChain( Chain, TRUE );
  398.     if ( Misc )
  399.         FreeMemoryChain( Misc, TRUE );
  400.     if ( FArgs )
  401.         FreeArgs( FArgs );
  402.  
  403.     CloseLibraries();
  404.  
  405.     _exit( code );
  406. }
  407.  
  408. /*
  409.  * --- Clear the entire edit window.
  410.  */
  411. void ClearWindow( void )
  412. {
  413.     WORD    x, y, x1, y1;
  414.  
  415.     x  = MainWindow->BorderLeft;
  416.     y  = MainWindow->BorderTop;
  417.     x1 = MainWindow->Width - MainWindow->BorderRight - 1;
  418.     y1 = MainWindow->Height - MainWindow->BorderBottom - 1;
  419.  
  420.     SetAPen( MainRP, 0);
  421.     SetDrMd( MainRP, JAM1 );
  422.     RectFill( MainRP, x, y, x1, y1 );
  423.  
  424.     RefreshWindowFrame( MainWindow );
  425. }
  426.  
  427. /*
  428.  * --- Move a gadget.
  429.  */
  430. void MoveGadget( void )
  431. {
  432.     struct ExtNewGadget *eng;
  433.     struct Gadget       *g;
  434.     WORD                 x, y, w, h, xo, yo, mx, my;
  435.     BOOL                 mm;
  436.  
  437.     if ( NOT Gadgets.gl_First->en_Next ) return;
  438.  
  439.     SetTitle( "CLICK ON GADGET TO MOVE..." );
  440.  
  441.     if ( g = WaitForGadget( MainWindow )) {
  442.  
  443.         mm = MouseMove( MainWindow, FALSE );
  444.  
  445.         RemoveAllGadgets();
  446.  
  447.         eng = FindExtGad( g );
  448.  
  449.         x = eng->en_NewGadget.ng_LeftEdge - 1;
  450.         y = eng->en_NewGadget.ng_TopEdge  - 1;
  451.         w = eng->en_NewGadget.ng_Width    + 1;
  452.         h = eng->en_NewGadget.ng_Height   + 1;
  453.  
  454.         Box( x, y, x + w, y + h );
  455.  
  456.         SetTitle( 0l );
  457.         DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1 );
  458.  
  459.         GetMouseXY( &mx, &my );
  460.  
  461.         xo = mx - x;
  462.         yo = my - y;
  463.  
  464.         while ( Code != SELECTDOWN ) {
  465.             while ( ReadIMsg( MainWindow )) {
  466.                 if ( Code == SELECTDOWN ) break;
  467.                 if ( Class == IDCMP_MENUPICK ) {
  468.                     SetTitle( 0l );
  469.                     DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1);
  470.                 }
  471.             }
  472.             GetMouseXY( &mx, &my );
  473.             if ( mx != ( x + xo ) || my != ( y + yo )) {
  474.                 Box( x, y, x + w, y + h );
  475.                 x = mx - xo;
  476.                 y = my - yo;
  477.                 Box( x, y, x + w, y + h );
  478.                 DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1 );
  479.             }
  480.         }
  481.  
  482.         Box( x, y, x + w, y + h );
  483.         eng->en_NewGadget.ng_LeftEdge = x + 1;
  484.         eng->en_NewGadget.ng_TopEdge  = y + 1;
  485.         RemakeAllGadgets();
  486.  
  487.         if ( mm ) MouseMove( MainWindow, TRUE );
  488.     }
  489.     SetWindowTitles( MainWindow, (char *)-1l, MainScreenTitle );
  490.     ClearMsgPort( MainWindow->UserPort );
  491.     RefreshWindow();
  492.     Saved = FALSE;
  493. }
  494.  
  495. /*
  496.  * --- Re-size a gadget.
  497.  */
  498. void SizeGadget( void )
  499. {
  500.     struct ExtNewGadget *eng;
  501.     struct Gadget       *g;
  502.     WORD                 x, y, w, h, xo, yo, mx, my;
  503.     WORD                 minx, miny;
  504.     BOOL                 mm;
  505.  
  506.     if ( NOT Gadgets.gl_First->en_Next ) return;
  507.  
  508.     SetTitle( "CLICK ON GADGET TO SIZE..." );
  509.  
  510.     if ( g = WaitForGadget( MainWindow )) {
  511.  
  512.         mm = MouseMove( MainWindow, FALSE );
  513.  
  514.         RemoveAllGadgets();
  515.  
  516.         eng = FindExtGad( g );
  517.  
  518.         if ( eng->en_Kind == CHECKBOX_KIND ) {
  519.             MyRequest( "Hey dude...", "OK", "You cannot resize a\n  CHECKBOX kind !" );
  520.             goto noWay;
  521.         } else if ( eng->en_Kind == MX_KIND ) {
  522.             MyRequest( "Hey dude...", "OK", "You cannot resize a\n     MX kind !" );
  523.             goto noWay;
  524.         } else if ( eng->en_Kind == STRING_KIND ) {
  525.             if (( eng->en_SpecialFlags & EGF_ISLOCKED ) == EGF_ISLOCKED ) {
  526.                 MyRequest( "Hey dude...", "OK", "You cannot resize a\nJoined string kind !" );
  527.                 goto noWay;
  528.             }
  529.         }
  530.  
  531.         x = eng->en_NewGadget.ng_LeftEdge - 1;
  532.         y = eng->en_NewGadget.ng_TopEdge  - 1;
  533.         w = eng->en_NewGadget.ng_Width    + 1;
  534.         h = eng->en_NewGadget.ng_Height   + 1;
  535.  
  536.         Box( x, y, x + w, y + h );
  537.  
  538.         SetTitle( 0l );
  539.         DisplayGInfo( eng->en_Kind , x + 1, y + 1, x + w - 1, y + h - 1 );
  540.  
  541.         GetMouseXY( &mx, &my );
  542.  
  543.         switch( eng->en_Kind ) {
  544.  
  545.             case    BUTTON_KIND:
  546.             case    CYCLE_KIND:
  547.                     minx = MainScreen->RastPort.TxWidth + 8;
  548.                     miny = MainScreen->RastPort.TxHeight + 3;
  549.                     break;
  550.  
  551.             case    INTEGER_KIND:
  552.             case    STRING_KIND:
  553.                     minx = MainScreen->RastPort.TxWidth  + 13;
  554.                     miny = MainScreen->RastPort.TxHeight + 4;
  555.                     break;
  556.  
  557.             case    LISTVIEW_KIND:
  558.                     if ( eng->en_ScrollWidth )
  559.                         minx = eng->en_ScrollWidth + 14;
  560.                     else
  561.                         minx = 30;
  562.                     miny = (MainScreen->RastPort.TxHeight << 1) + 9;
  563.                     break;
  564.  
  565.             case    PALETTE_KIND:
  566.                     if ( MyTagInArray( GTPA_IndicatorWidth, eng->en_Tags )) {
  567.                         minx = eng->en_IndicatorSize + 20;
  568.                         miny = 20;
  569.                     } else {
  570.                         minx = 20;
  571.                         miny =  ( eng->en_IndicatorSize >> 1 ) + 20;
  572.                     }
  573.                     break;
  574.  
  575.             case    SCROLLER_KIND:
  576.                     if ( NOT MyTagInArray( PGA_Freedom, eng->en_Tags )) {
  577.                         minx = ( eng->en_ArrowSize << 1 ) + 10;
  578.                         miny = 8;
  579.                     } else {
  580.                         minx = 10;
  581.                         miny = (eng->en_ArrowSize << 1) + 10;
  582.                     }
  583.                     break;
  584.  
  585.             case    SLIDER_KIND:
  586.                     minx = 12;
  587.                     miny = 8;
  588.                     break;
  589.         }
  590.  
  591.         xo = x + w - mx;
  592.         yo = y + h - my;
  593.  
  594.         while ( Code != SELECTDOWN ) {
  595.             while ( ReadIMsg( MainWindow )) {
  596.                 if ( Code == SELECTDOWN ) break;
  597.                 if ( Class == IDCMP_MENUPICK ) {
  598.                     SetTitle( 0l );
  599.                     DisplayGInfo( eng->en_Kind , x + 1, y + 1, x + w - 1, y + h - 1 );
  600.                 }
  601.             }
  602.             GetMouseXY( &mx, &my );
  603.             if ( mx != ( x + w - xo ) || my != ( y + h - yo )) {
  604.                 Box( x, y, x + w, y + h );
  605.                 if (( mx - x + xo ) >= minx ) w = mx - x + xo;
  606.                 if (( my - y + yo ) >= miny ) h = my - y + yo;
  607.                 Box( x, y, x + w, y + h );
  608.                 DisplayGInfo( eng->en_Kind , x + 1, y + 1, x + w - 1, y + h - 1 );
  609.             }
  610.         }
  611.  
  612.         Box( x, y, x + w, y + h );
  613.         eng->en_NewGadget.ng_Width   = w - 1;
  614.         eng->en_NewGadget.ng_Height  = h - 1;
  615.         noWay:
  616.         RemakeAllGadgets();
  617.  
  618.         if ( mm ) MouseMove( MainWindow, TRUE );
  619.     }
  620.     SetWindowTitles( MainWindow, (char *)-1l, MainScreenTitle );
  621.     ClearMsgPort( MainWindow->UserPort );
  622.     RefreshWindow();
  623.     Saved = FALSE;
  624. }
  625.  
  626. /*
  627.  * --- Clone a gadget.
  628.  */
  629. void CopyGadget( void )
  630. {
  631.     struct ExtNewGadget *eng, *eng1 = 0l;
  632.     struct TagItem      *tags = 0l;
  633.     struct Gadget       *g;
  634.     WORD                 x, y, w, h, xo, yo, mx, my;
  635.     BOOL                 mm;
  636.  
  637.     if ( NOT Gadgets.gl_First->en_Next ) return;
  638.  
  639.     SetTitle( "CLICK ON GADGET TO COPY..." );
  640.  
  641.     if ( g = WaitForGadget( MainWindow )) {
  642.  
  643.         RemoveAllGadgets();
  644.  
  645.         eng = FindExtGad( g );
  646.  
  647.         if ( eng1 = AllocItem( Chain, (long)sizeof( struct ExtNewGadget ), MEMF_PUBLIC )) {
  648.             if ( tags = MakeTagList( eng->en_NumTags )) {
  649.  
  650.                 CopyMem(( void * )eng, ( void * )eng1, (long)sizeof( struct ExtNewGadget ));
  651.                 CopyMem(( void * )eng->en_Tags, ( void * )tags, (long)( eng->en_NumTags * sizeof( struct TagItem )));
  652.  
  653.                 eng1->en_Tags = tags;
  654.  
  655.                 switch ( eng->en_Kind ) {
  656.  
  657.                     case    STRING_KIND:
  658.                         if ( eng->en_DefString ) {
  659.                             if ( eng1->en_DefString = AllocItem( Chain, (long)strlen( eng->en_DefString ) + 1, MEMF_PUBLIC )) {
  660.                                 strcpy( eng1->en_DefString, eng->en_DefString );
  661.                                 SetTagData( tags, GTST_String, (Tag)eng1->en_DefString );
  662.                             } else
  663.                                 goto noMem;
  664.                         }
  665.                         break;
  666.  
  667.                     case    LISTVIEW_KIND:
  668.                         if ( NOT CopyList( eng, eng1 )) goto noMem;
  669.                         break;
  670.  
  671.                     case    CYCLE_KIND:
  672.                         if ( NOT CopyLabels( eng, eng1, FALSE )) goto noMem;
  673.                         break;
  674.  
  675.                     case    MX_KIND:
  676.                         if ( NOT CopyLabels( eng, eng1, TRUE )) goto noMem;
  677.                         break;
  678.  
  679.                     case    SLIDER_KIND:
  680.                         if ( eng->en_LevelFormat ) {
  681.                             if ( eng1->en_LevelFormat = AllocItem( Chain, (long)strlen( eng->en_LevelFormat ) + 1, MEMF_PUBLIC )) {
  682.                                 strcpy( eng1->en_LevelFormat, eng->en_LevelFormat );
  683.                                 SetTagData( tags, GTSL_LevelFormat, (Tag)eng1->en_LevelFormat );
  684.                             } else
  685.                                 goto noMem;
  686.                         }
  687.                         break;
  688.                 }
  689.  
  690.                 x = eng1->en_NewGadget.ng_LeftEdge - 1;
  691.                 y = eng1->en_NewGadget.ng_TopEdge  - 1;
  692.                 w = eng1->en_NewGadget.ng_Width    + 1;
  693.                 h = eng1->en_NewGadget.ng_Height   + 1;
  694.  
  695.                 Box( x, y, x + w, y + h );
  696.  
  697.                 SetTitle( 0l );
  698.                 DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1 );
  699.  
  700.                 GetMouseXY( &mx, &my );
  701.  
  702.                 xo = mx - x;
  703.                 yo = my - y;
  704.  
  705.                 mm = MouseMove( MainWindow, FALSE );
  706.  
  707.                 while ( Code != SELECTDOWN ) {
  708.                     while ( ReadIMsg( MainWindow )) {
  709.                         if ( Code == SELECTDOWN ) break;
  710.                         if ( Class == IDCMP_MENUPICK ) {
  711.                             SetTitle( 0l );
  712.                             DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1 );
  713.                         }
  714.                     }
  715.                     GetMouseXY( &mx, &my );
  716.                     if ( mx != ( x + xo ) || my != ( y + yo )) {
  717.                         Box( x, y, x + w, y + h );
  718.                         x = mx - xo;
  719.                         y = my - yo;
  720.                         Box( x, y, x + w, y + h );
  721.                         DisplayGInfo( eng->en_Kind, x + 1, y + 1, x + w - 1, y + h - 1 );
  722.                     }
  723.                 }
  724.  
  725.                 if ( mm ) MouseMove( MainWindow, TRUE );
  726.  
  727.                 Box( x, y, x + w, y + h );
  728.                 eng1->en_NewGadget.ng_LeftEdge = x + 1;
  729.                 eng1->en_NewGadget.ng_TopEdge  = y + 1;
  730.                 eng1->en_SpecialFlags         &= ~EGF_USERLABEL;
  731.                 AddTail(( struct List * )&Gadgets, ( struct Node * )eng1 );
  732.                 Renumber();
  733.                 RemakeAllGadgets();
  734.                 goto doneIt;
  735.             }
  736.         }
  737.     } else goto doneIt;
  738.     noMem:
  739.     MyRequest( "Oh oh...", "CONTINUE", "Out of memory !" );
  740.     if ( eng )
  741.         FreeExtGad( eng );
  742.     doneIt:
  743.     SetWindowTitles( MainWindow, (char *)-1l, MainScreenTitle );
  744.     ClearMsgPort( MainWindow->UserPort );
  745.     RefreshWindow();
  746.     Saved = FALSE;
  747. }
  748.  
  749. /*
  750.  * --- Remove and deallocate a gadget.
  751.  */
  752. void DeleteGadget( void )
  753. {
  754.     struct Gadget       *g;
  755.     struct ExtNewGadget *eng;
  756.  
  757.     if ( NOT Gadgets.gl_First->en_Next ) return;
  758.  
  759.     SetTitle( "CLICK ON GADGET TO DELETE..." );
  760.  
  761.     if ( g = WaitForGadget( MainWindow )) {
  762.  
  763.         RemoveAllGadgets();
  764.  
  765.         eng = FindExtGad( g );
  766.  
  767.         Remove(( struct Node * )eng );
  768.  
  769.         if (( eng->en_SpecialFlags & EGF_NEEDLOCK ) == EGF_NEEDLOCK )
  770.             eng->en_Prev->en_SpecialFlags &= ~EGF_ISLOCKED;
  771.         else if (( eng->en_SpecialFlags & EGF_ISLOCKED ) == EGF_ISLOCKED ) {
  772.             eng->en_Next->en_SpecialFlags &= ~EGF_NEEDLOCK;
  773.             SetTagData( eng->en_Next->en_Tags, GTLV_ShowSelected, 0l );
  774.         }
  775.  
  776.         FreeExtGad( eng );
  777.  
  778.         RemakeAllGadgets();
  779.     }
  780.     SetWindowTitles( MainWindow, (char *)-1l, MainScreenTitle );
  781.     ClearMsgPort( MainWindow->UserPort );
  782.     RefreshWindow();
  783.     Saved = FALSE;
  784. }
  785.  
  786. /*
  787.  * --- Edit a gadget
  788.  */
  789. void EditGadget( void )
  790. {
  791.     struct Gadget       *g;
  792.     struct ExtNewGadget *eng;
  793.  
  794.     if ( NOT Gadgets.gl_First->en_Next ) return;
  795.  
  796.     SetTitle( "CLICK ON GADGET TO EDIT..." );
  797.  
  798.     if ( g = WaitForGadget( MainWindow )) {
  799.         eng = FindExtGad( g );
  800.  
  801.         switch( eng->en_Kind ) {
  802.             case    BUTTON_KIND:
  803.                 EditButton( 0, 0, 0, 0, g );
  804.                 break;
  805.  
  806.             case    CHECKBOX_KIND:
  807.                 EditCheckBox( 0, 0, 0, 0, g );
  808.                 break;
  809.  
  810.             case    STRING_KIND:
  811.             case    INTEGER_KIND:
  812.                 EditStrInt( 0, 0, 0, 0, g );
  813.                 break;
  814.  
  815.             case    LISTVIEW_KIND:
  816.                 EditListView( 0, 0, 0, 0, g);
  817.                 break;
  818.  
  819.             case    MX_KIND:
  820.                 EditMX( 0, 0, 0, 0, g );
  821.                 break;
  822.  
  823.             case    CYCLE_KIND:
  824.                 EditCycle( 0, 0, 0, 0, g );
  825.                 break;
  826.  
  827.             case    PALETTE_KIND:
  828.                 EditPalette( 0, 0, 0, 0, g );
  829.                 break;
  830.  
  831.             case    SCROLLER_KIND:
  832.                 EditScroller( 0, 0, 0, 0, g );
  833.                 break;
  834.  
  835.             case    SLIDER_KIND:
  836.                 EditSlider( 0, 0, 0, 0, g );
  837.         }
  838.     }
  839.     SetWindowTitles( MainWindow, (char *)-1l, MainScreenTitle );
  840.     RefreshWindow();
  841. }
  842.  
  843. /*
  844.  * --- Display the mouse size/place info.
  845.  */
  846. void DisplayGInfo( long kind, WORD x, WORD y, WORD x1, WORD y1 )
  847. {
  848.     WORD    tmp;
  849.  
  850.     switch( kind ) {
  851.         case    CHECKBOX_KIND:
  852.             UpdateCoords( 1, x1 - 25, y1 - 10, 25, 10 );
  853.             break;
  854.  
  855.         case    MX_KIND:
  856.             UpdateCoords( 1, x1 - 16, y1 - 8, 16, 8 );
  857.             break;
  858.  
  859.         default:
  860.             if ( x1 < x ) { tmp = x1; x1 = x; x = tmp; }
  861.             if ( y1 < y ) { tmp = y1; y1 = y; y = tmp; }
  862.             UpdateCoords( 1, x, y, x1 - x, y1 - y );
  863.             break;
  864.     }
  865. }
  866.  
  867. /*
  868.  * --- Joins a String and a ListView Gadget.
  869.  */
  870. void Join( void )
  871. {
  872.     struct ExtNewGadget *lv,  *st;
  873.     struct Gadget       *lvg, *stg;
  874.     struct TagItem      *tags;
  875.  
  876.  
  877.     if ( NOT Gadgets.gl_First->en_Next ) return;
  878.  
  879.     SetTitle( "CLICK ON LISTVIEW TO JOIN..." );
  880.  
  881.     if ( lvg = WaitForGadget( MainWindow )) {
  882.  
  883.         lv = FindExtGad( lvg );
  884.  
  885.         if ( lv->en_Kind != LISTVIEW_KIND ) {
  886.             MyRequest( "Yo..",  "OK", "This isn't a ListView Gadget !" );
  887.             goto done;
  888.         }
  889.  
  890.         if (( lv->en_SpecialFlags & EGF_NEEDLOCK ) == EGF_NEEDLOCK ) {
  891.             MyRequest( "Yo..", "OK", "This ListView already is joined !" );
  892.             goto done;
  893.         }
  894.  
  895.         if (( lv->en_SpecialFlags & EGF_READONLY ) == EGF_READONLY ) {
  896.             MyRequest( "Yo..", "OK", "Can't join a Read Only ListView !" );
  897.             goto done;
  898.         }
  899.  
  900.         SetTitle( "CLICK ON STRING TO JOIN..." );
  901.  
  902.         if ( stg = WaitForGadget( MainWindow )) {
  903.  
  904.             st = FindExtGad( stg );
  905.  
  906.             if ( st->en_Kind != STRING_KIND ) {
  907.                 MyRequest( "Yo..",  "OK", "This isn't a String Gadget !" );
  908.                 goto done;
  909.             }
  910.  
  911.             if (( st->en_SpecialFlags & EGF_ISLOCKED ) == EGF_ISLOCKED ) {
  912.                 MyRequest( "Yo..", "OK", "This String already is joined !" );
  913.                 goto done;
  914.             }
  915.  
  916.             RemoveAllGadgets();
  917.  
  918.             Remove(( struct Node * )lv );
  919.  
  920.             Insert(( struct List * )&Gadgets, ( struct Node * )lv, ( struct Node * )st );
  921.  
  922.             lv->en_SpecialFlags |= EGF_NEEDLOCK;
  923.             st->en_SpecialFlags |= EGF_ISLOCKED;
  924.  
  925.             tags = lv->en_Tags;
  926.  
  927.             while ( 1 ) {
  928.                 if ( tags->ti_Tag == GTLV_ShowSelected )
  929.                     break;
  930.                 if ( tags->ti_Tag == TAG_DONE ) {
  931.                     tags->ti_Tag  = GTLV_ShowSelected;
  932.                     tags->ti_Data = 0l;
  933.                     tags++;
  934.                     tags->ti_Tag  = TAG_DONE;
  935.                     break;
  936.                 }
  937.                 tags++;
  938.             }
  939.             Saved = FALSE;
  940.             RemakeAllGadgets();
  941.         }
  942.     }
  943.     done:
  944.     SetWindowTitles( MainWindow, MainWindowTitle, MainScreenTitle );
  945.     ClearMsgPort( MainWindow->UserPort );
  946.     RefreshWindow();
  947. }
  948.  
  949. /*
  950.  * --- Splits a String and a ListView Gadget.
  951.  */
  952. void Split( void )
  953. {
  954.     struct ExtNewGadget *lv, *glv, *gst;
  955.     struct Gadget       *lvg;
  956.  
  957.     if ( NOT Gadgets.gl_First->en_Next ) return;
  958.  
  959.     SetTitle( "CLICK ON GADGET TO SPLIT..." );
  960.  
  961.     if ( lvg = WaitForGadget( MainWindow )) {
  962.  
  963.         lv = FindExtGad( lvg );
  964.  
  965.         if ( lv->en_Kind == LISTVIEW_KIND ) {
  966.             if (( lv->en_SpecialFlags & EGF_NEEDLOCK ) != EGF_NEEDLOCK ) {
  967.                 MyRequest( "Yo..", "OK", "This ListView is not joined !" );
  968.                 goto done;
  969.             } else {
  970.                gst = lv->en_Prev;
  971.                glv = lv;
  972.             }
  973.         } else if ( lv->en_Kind == STRING_KIND ) {
  974.             if (( lv->en_SpecialFlags & EGF_ISLOCKED ) != EGF_ISLOCKED ) {
  975.                 MyRequest( "Yo..", "OK", "This String is not joined !" );
  976.                 goto done;
  977.             } else {
  978.                 gst = lv;
  979.                 glv = gst->en_Next;
  980.             }
  981.         } else {
  982.             MyRequest( "Yo..", "OK", "This gadget is NOT joined !" );
  983.             goto done;
  984.         }
  985.  
  986.         RemoveAllGadgets();
  987.  
  988.         gst->en_SpecialFlags &= ~EGF_ISLOCKED;
  989.         glv->en_SpecialFlags &= ~EGF_NEEDLOCK;
  990.  
  991.         SetTagData( glv->en_Tags, GTLV_ShowSelected, 0l );
  992.  
  993.         Saved = FALSE;
  994.         RemakeAllGadgets();
  995.     }
  996.     done:
  997.     SetWindowTitles( MainWindow, MainWindowTitle, MainScreenTitle );
  998.     ClearMsgPort( MainWindow->UserPort );
  999.     RefreshWindow();
  1000. }
  1001.  
  1002. /*
  1003.  * --- Parses the filename for the ASL FileRequester.
  1004.  */
  1005. long ParseName( void )
  1006. {
  1007.     char    *ptr;
  1008.     long     len;
  1009.  
  1010.     if ( strlen( MainFileName )) {
  1011.         if (( ptr = strrchr( MainFileName, (int)'/' )) || ( ptr = strrchr( MainFileName, (int)':' ))) {
  1012.             ptr++;
  1013.             strcpy( bi_SFile, ptr );
  1014.             strcpy( bi_LFile, ptr );
  1015.             len = (long)( ptr - MainFileName);
  1016.             strncpy( bi_SPath, MainFileName, len );
  1017.             strncpy( bi_LPath, MainFileName, len );
  1018.  
  1019.             bi_SPath[ len ] = bi_LPath[ len ] = 0;
  1020.  
  1021.             len = strlen( bi_SFile );
  1022.  
  1023.             CheckSuffix();
  1024.  
  1025.             if ( NOT strlen( bi_SFile )) {
  1026.                 strcpy( bi_SFile, "unnamed.g" );
  1027.                 strcpy( bi_LFile, "unnamed.g" );
  1028.             }
  1029.         } else {
  1030.             strcpy( bi_SFile, MainFileName );
  1031.             strcpy( bi_LFile, MainFileName );
  1032.             CheckSuffix();
  1033.             len = strlen( bi_SFile );
  1034.         }
  1035.     }
  1036.     return((long)len );
  1037. }
  1038.  
  1039. /*
  1040.  * --- Main routine. Waits for user input.
  1041.  */
  1042. void _main( void )
  1043. {
  1044.     struct Process          *proc = ( struct Process * )FindTask( 0l );
  1045.     struct WBArg            *wba;
  1046.     UWORD                    l, t, x, y, x1, y1;
  1047.     BOOL                     running = TRUE, mm;
  1048.  
  1049.     if ( proc->pr_CLI ) {
  1050.         if ( FArgs = ReadArgs( Template, &Args[0], &IArgs )) {
  1051.             if ( Args[0] ) {
  1052.                 SetupProgram( TRUE );
  1053.                 strcpy( MainFileName, (char *)Args[0] );
  1054.                 if( ParseName())
  1055.                     ReadBinary( FALSE );
  1056.                 else
  1057.                     ReOpenScreen( 0l );
  1058.             } else
  1059.                 SetupProgram( FALSE );
  1060.         } else
  1061.             QuitProgram( 27l );
  1062.     } else if ( _WBMsg ) {
  1063.         wba = _WBMsg->sm_ArgList;
  1064.         if ( wba->wa_Lock ) {
  1065.             CurrentDir( wba->wa_Lock );
  1066.             if ( _WBMsg->sm_NumArgs > 1 ) {
  1067.                 wba++;
  1068.                 if ( wba->wa_Lock )
  1069.                     CurrentDir( wba->wa_Lock );
  1070.                 SetupProgram( TRUE );
  1071.                 strcpy( MainFileName, wba->wa_Name );
  1072.                 if ( ParseName())
  1073.                     ReadBinary( FALSE );
  1074.                 else
  1075.                     ReOpenScreen( 0l );
  1076.             } else
  1077.                 SetupProgram( FALSE );
  1078.         } else
  1079.             SetupProgram( FALSE );
  1080.     }
  1081.  
  1082.     if (( MainPrefs.pr_PrefFlags0 & PRF_COORDS ) == PRF_COORDS )
  1083.         MouseMove( MainWindow, TRUE );
  1084.  
  1085.     do {
  1086.         WaitPort( MainWindow->UserPort );
  1087.  
  1088.         while ( ReadIMsg( MainWindow )) {
  1089.  
  1090.             switch ( Class ) {
  1091.  
  1092.                 case    IDCMP_REFRESHWINDOW:
  1093.                     GT_BeginRefresh( MainWindow );
  1094.                     GT_EndRefresh( MainWindow, TRUE );
  1095.                     break;
  1096.  
  1097.                 case    IDCMP_CLOSEWINDOW:
  1098.                     Quit();
  1099.                     break;
  1100.  
  1101.                 case    IDCMP_CHANGEWINDOW:
  1102.                     RefreshWindow();
  1103.                     ws_IWidth  = MainWindow->Width - MainWindow->BorderLeft - MainWindow->BorderRight;
  1104.                     ws_IHeight = MainWindow->Height - MainWindow->BorderTop - MainWindow->BorderBottom;
  1105.                     break;
  1106.  
  1107.                 case    IDCMP_MENUPICK:
  1108.                     if (( MainPrefs.pr_PrefFlags0 & PRF_COORDS ) == PRF_COORDS )
  1109.                         MouseMove( MainWindow, TRUE );
  1110.                     HandleMenus();
  1111.                     break;
  1112.  
  1113.                 case    IDCMP_MOUSEMOVE:
  1114.                     if (( MainPrefs.pr_PrefFlags0 & PRF_COORDS ) == PRF_COORDS )
  1115.                         UpdateCoords( 0l, 0, 0, 0, 0 );
  1116.                     break;
  1117.  
  1118.                 case    IDCMP_MOUSEBUTTONS:
  1119.                     if ( Code == SELECTDOWN ) {
  1120.                         GetMouseXY( &x, &y );
  1121.                         l = x;
  1122.                         t = y;
  1123.                         SetTitle( 0l );
  1124.                         if ( ActiveKind == CHECKBOX_KIND )
  1125.                             Box( x - 25, y - 10, x, y );
  1126.                         else if ( ActiveKind == MX_KIND )
  1127.                             Box( x - 16, y - 8, x, y );
  1128.                         else
  1129.                             Box( l, t, x, y );
  1130.  
  1131.                         DisplayGInfo( ActiveKind, l, t, x, y );
  1132.  
  1133.                         Code = SELECTUP;
  1134.  
  1135.                         mm = MouseMove( MainWindow, FALSE );
  1136.  
  1137.                         while ( Code != SELECTDOWN ) {
  1138.                             while ( ReadIMsg( MainWindow )) {
  1139.                                 if ( Code  == SELECTDOWN ) break;
  1140.                                 if ( Class == IDCMP_MENUPICK ) {
  1141.                                     SetTitle( 0l );
  1142.                                     DisplayGInfo( ActiveKind, l, t, x, y );
  1143.                                 }
  1144.                             }
  1145.                             GetMouseXY( &x1, &y1 );
  1146.  
  1147.                             if ( x1 != x || y1 != y ) {
  1148.                                 if ( ActiveKind == CHECKBOX_KIND )
  1149.                                     Box( x - 25 , y - 10, x, y );
  1150.                                 else if ( ActiveKind == MX_KIND )
  1151.                                     Box( x - 16, y - 8, x, y );
  1152.                                 else
  1153.                                     Box( l, t, x, y );
  1154.                                 GetMouseXY( &x, &y );
  1155.                                 if ( ActiveKind == CHECKBOX_KIND )
  1156.                                     Box( x - 25, y - 10, x, y );
  1157.                                 else if ( ActiveKind == MX_KIND )
  1158.                                     Box( x - 16, y - 8, x, y );
  1159.                                 else
  1160.                                     Box( l, t, x, y );
  1161.                                 DisplayGInfo( ActiveKind, l, t, x, y );
  1162.                             }
  1163.                         }
  1164.  
  1165.                         SetWindowTitles( MainWindow, MainWindowTitle, MainScreenTitle  );
  1166.  
  1167.                         if ( mm ) MouseMove( MainWindow, TRUE );
  1168.  
  1169.                         switch ( ActiveKind ) {
  1170.  
  1171.                             case    BUTTON_KIND:
  1172.                                 EditButton( l, t, x, y, 0l );
  1173.                                 break;
  1174.  
  1175.                             case    CHECKBOX_KIND:
  1176.                                 EditCheckBox( x - 25, y - 10, x, y, 0l );
  1177.                                 break;
  1178.  
  1179.                             case    STRING_KIND:
  1180.                             case    INTEGER_KIND:
  1181.                                 EditStrInt( l, t, x, y, 0l );
  1182.                                 break;
  1183.  
  1184.                             case    LISTVIEW_KIND:
  1185.                                 EditListView( l, t, x, y, 0l );
  1186.                                 break;
  1187.  
  1188.                             case    MX_KIND:
  1189.                                 EditMX( x - 16, y - 8, x, y, 0l );
  1190.                                 break;
  1191.  
  1192.                             case    CYCLE_KIND:
  1193.                                 EditCycle( l, t, x, y, 0l );
  1194.                                 break;
  1195.  
  1196.                             case    PALETTE_KIND:
  1197.                                 EditPalette( l, t, x, y, 0l );
  1198.                                 break;
  1199.  
  1200.                             case    SCROLLER_KIND:
  1201.                                 EditScroller( l, t, x, y, 0l );
  1202.                                 break;
  1203.  
  1204.                             case    SLIDER_KIND:
  1205.                                 EditSlider( l, t, x, y, 0l );
  1206.                                 break;
  1207.                         }
  1208.                     }
  1209.                     break;
  1210.             }
  1211.         }
  1212.      } while ( running );
  1213.  
  1214.     QuitProgram(0L);
  1215.  
  1216.     _waitwbmsg();
  1217. }
  1218.